{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "#import 模块\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#读取数据\n",
    "train = pd.read_csv(\"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看属性的统计特征\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "#分开x和y，并把缺失值用中位数补\n",
    "from sklearn import preprocessing\n",
    "y_train = train['Outcome']\n",
    "train = train.drop(['Outcome'],axis = 1)\n",
    "X_train = np.array(train)\n",
    "\n",
    "imp = preprocessing.Imputer(missing_values = 0,strategy = 'mean',axis = 0,verbose = 0,copy=False)\n",
    "\n",
    "X_train = imp.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "#数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "ss = StandardScaler()\n",
    "\n",
    "X_train = ss.fit_transform(X_train)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/model_selection/_split.py:2069: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "#分割数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part,X_test,y_train_Part,y_test = train_test_split(X_train,y_train,train_size = 0.8,random_state = 1)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# #Logistic回归，并选择最佳的正则函数（L1/L2）及正则参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise-deprecating',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None, penalty='l2', random_state=None, solver='warn',\n",
       "          tol=0.0001, verbose=0, warm_start=False),\n",
       "       fit_params=None, iid='warn', n_jobs=None,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Logistic回归，并选择最佳的正则函数（L1/L2）及正则参数\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_par = dict(penalty = penaltys,C = Cs)\n",
    "\n",
    "lr_penalty = LogisticRegression()\n",
    "grid = GridSearchCV(lr_penalty,tuned_par,cv = 5, scoring='neg_log_loss')\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.00203381, 0.00208526, 0.00159492, 0.00201917, 0.00169182,\n",
       "        0.00211701, 0.00197511, 0.0029716 , 0.00224295, 0.00267296,\n",
       "        0.00237288, 0.0022893 , 0.00173311, 0.00266399]),\n",
       " 'std_fit_time': array([4.35529826e-04, 2.45985099e-04, 1.82954570e-04, 2.18177987e-04,\n",
       "        1.36267262e-04, 2.91458692e-05, 1.93291716e-04, 1.74121344e-04,\n",
       "        1.95983471e-04, 8.23570247e-05, 4.33808474e-04, 2.21162245e-04,\n",
       "        5.18360373e-05, 9.20244571e-05]),\n",
       " 'mean_score_time': array([0.00133758, 0.0011548 , 0.001124  , 0.00103779, 0.00104194,\n",
       "        0.00101266, 0.00114622, 0.00135036, 0.00118423, 0.00118461,\n",
       "        0.0011838 , 0.00104551, 0.00103235, 0.00116215]),\n",
       " 'std_score_time': array([2.24846463e-04, 1.27328968e-04, 7.69587106e-05, 3.39615194e-05,\n",
       "        7.31088560e-05, 1.28486159e-05, 1.29654522e-04, 1.29629863e-04,\n",
       "        8.32812171e-05, 4.95721708e-05, 1.59474293e-04, 5.58678173e-05,\n",
       "        6.26840487e-05, 2.26563394e-05]),\n",
       " 'param_C': masked_array(data=[0.001, 0.001, 0.01, 0.01, 0.1, 0.1, 1, 1, 10, 10, 100,\n",
       "                    100, 1000, 1000],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'},\n",
       "  {'C': 1000, 'penalty': 'l1'},\n",
       "  {'C': 1000, 'penalty': 'l2'}],\n",
       " 'split0_test_score': array([-0.69314718, -0.62314104, -0.6358977 , -0.50734655, -0.48157628,\n",
       "        -0.4753298 , -0.47751234, -0.47738551, -0.47801552, -0.47801559,\n",
       "        -0.47808607, -0.47808542, -0.47809243, -0.47809248]),\n",
       " 'split1_test_score': array([-0.69314718, -0.6330681 , -0.64465445, -0.54443864, -0.52782252,\n",
       "        -0.53216042, -0.53831197, -0.53944241, -0.54066307, -0.54077611,\n",
       "        -0.54091109, -0.5409192 , -0.54093264, -0.54093362]),\n",
       " 'split2_test_score': array([-0.69314718, -0.62584293, -0.63320166, -0.50974135, -0.46399127,\n",
       "        -0.46662638, -0.46241155, -0.46325377, -0.46299336, -0.46308823,\n",
       "        -0.46306311, -0.46307454, -0.46306948, -0.46307321]),\n",
       " 'split3_test_score': array([-0.69314718, -0.61933734, -0.63014377, -0.48506064, -0.43212548,\n",
       "        -0.42723891, -0.42056447, -0.42064483, -0.42008668, -0.42010083,\n",
       "        -0.4200477 , -0.42004853, -0.42004413, -0.42004332]),\n",
       " 'split4_test_score': array([-0.69314718, -0.63138853, -0.63572137, -0.5227413 , -0.4843153 ,\n",
       "        -0.48180274, -0.48042138, -0.47981281, -0.47989482, -0.4798746 ,\n",
       "        -0.47988412, -0.47988509, -0.47988619, -0.47988618]),\n",
       " 'mean_test_score': array([-0.69314718, -0.62655869, -0.63593158, -0.51389165, -0.47801759,\n",
       "        -0.47668923, -0.47591036, -0.47617526, -0.47639929, -0.47643978,\n",
       "        -0.47646725, -0.4764714 , -0.47647383, -0.47647462]),\n",
       " 'std_test_score': array([1.11022302e-16, 5.09681388e-03, 4.84089779e-03, 1.95026096e-02,\n",
       "        3.10943838e-02, 3.36162816e-02, 3.78439931e-02, 3.81229238e-02,\n",
       "        3.87150830e-02, 3.87416840e-02, 3.88045109e-02, 3.88061934e-02,\n",
       "        3.88123693e-02, 3.88126722e-02]),\n",
       " 'rank_test_score': array([14, 12, 13, 11, 10,  9,  1,  2,  3,  4,  5,  6,  7,  8],\n",
       "       dtype=int32),\n",
       " 'split0_train_score': array([-0.69314718, -0.62688176, -0.63262089, -0.50922576, -0.46847362,\n",
       "        -0.46451747, -0.46172941, -0.46163801, -0.46159298, -0.46159207,\n",
       "        -0.46159159, -0.46159158, -0.46159158, -0.46159158]),\n",
       " 'split1_train_score': array([-0.69314718, -0.62194601, -0.62085185, -0.49824695, -0.45699882,\n",
       "        -0.45209203, -0.44911119, -0.44904799, -0.44899897, -0.44899834,\n",
       "        -0.4489978 , -0.44899779, -0.44899779, -0.44899779]),\n",
       " 'split2_train_score': array([-0.69314718, -0.62609601, -0.64118324, -0.51060449, -0.47286811,\n",
       "        -0.46843429, -0.46594783, -0.46585959, -0.46582059, -0.46581967,\n",
       "        -0.46581925, -0.46581924, -0.46581924, -0.46581924]),\n",
       " 'split3_train_score': array([-0.69314718, -0.62919393, -0.64399708, -0.51880042, -0.48289501,\n",
       "        -0.47852585, -0.47615448, -0.47606831, -0.47603125, -0.47603035,\n",
       "        -0.47602996, -0.47602994, -0.47602994, -0.47602994]),\n",
       " 'split4_train_score': array([-0.69314718, -0.6231555 , -0.63414479, -0.50667428, -0.46744126,\n",
       "        -0.46431034, -0.46173114, -0.46164232, -0.46160149, -0.46160032,\n",
       "        -0.46159989, -0.46159987, -0.46159986, -0.46159986]),\n",
       " 'mean_train_score': array([-0.69314718, -0.62545464, -0.63455957, -0.50871038, -0.46973536,\n",
       "        -0.46557599, -0.46293481, -0.46285124, -0.46280906, -0.46280815,\n",
       "        -0.4628077 , -0.46280769, -0.46280768, -0.46280768]),\n",
       " 'std_train_score': array([0.        , 0.00260871, 0.00805943, 0.00662256, 0.00839124,\n",
       "        0.00849009, 0.0086929 , 0.00868567, 0.00868966, 0.00868958,\n",
       "        0.00868963, 0.00868963, 0.00868963, 0.00868963])}"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.47591036212648924\n",
      "{'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegressionCV(Cs=[1, 10, 100, 1000], class_weight=None, cv=5,\n",
       "           dual=False, fit_intercept=True, intercept_scaling=1.0,\n",
       "           max_iter=100, multi_class='ovr', n_jobs=None, penalty='l2',\n",
       "           random_state=None, refit=True, scoring='neg_log_loss',\n",
       "           solver='liblinear', tol=0.0001, verbose=0)"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegressionCV\n",
    "\n",
    "Cs = [1, 10,100,1000]\n",
    "\n",
    "lr_cv_L2 = LogisticRegressionCV(Cs=Cs, cv = 5, scoring='neg_log_loss', penalty='l2', solver='liblinear', multi_class='ovr')\n",
    "lr_cv_L2.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1: array([[-0.47738551, -0.47801559, -0.47808542, -0.47809248],\n",
       "        [-0.53944241, -0.54077611, -0.5409192 , -0.54093362],\n",
       "        [-0.46325377, -0.46308823, -0.46307454, -0.46307321],\n",
       "        [-0.42064483, -0.42010083, -0.42004853, -0.42004332],\n",
       "        [-0.47981281, -0.4798746 , -0.47988509, -0.47988618]])}"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr_cv_L2.scores_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LogisticRegressionCV(Cs=[1, 10, 100, 1000], class_weight=None, cv=5,\n",
      "           dual=False, fit_intercept=True, intercept_scaling=1.0,\n",
      "           max_iter=100, multi_class='ovr', n_jobs=None, penalty='l2',\n",
      "           random_state=None, refit=True, scoring='neg_log_loss',\n",
      "           solver='liblinear', tol=0.0001, verbose=0):\n",
      "0.7792207792207793\n",
      "\n",
      "Confusion matrix:\n",
      "0.7792207792207793\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "y_predict = lr_cv_L2.predict(X_test);\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (lr_cv_L2, accuracy_score(y_test, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % accuracy_score(y_test, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线性SVN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import LinearSVC\n",
    "def fit_grid_linear_svn(C,X_train,y_train,X_test,y_test):\n",
    "    SVC2 = LinearSVC(C = C)\n",
    "    SVC2 = SVC2.fit(X_train,y_train)\n",
    "    accuracy = SVC2.score(X_test, y_test)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/svm/base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/svm/base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "/home/chsl/.local/lib/python3.6/site-packages/sklearn/svm/base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.8051948051948052\n",
      "accuracy: 0.4675324675324675\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "C_s = np.logspace(-3,3,6)\n",
    "accuracy_s = []\n",
    "for i,oneC in enumerate(C_s):\n",
    "    tmp = fit_grid_linear_svn(oneC,X_train,y_train,X_test,y_test)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_HW.png' )\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "和 Logistic 回归差不多"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RBF核的SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC\n",
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_test, y_test):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_test, y_test)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.7857142857142857\n",
      "accuracy: 0.8181818181818182\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.7792207792207793\n",
      "accuracy: 0.8051948051948052\n",
      "accuracy: 0.9155844155844156\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.8441558441558441\n",
      "accuracy: 0.9805194805194806\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.7857142857142857\n",
      "accuracy: 0.8701298701298701\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "C_s2 = np.logspace(-3,3,6)\n",
    "gamma_s = np.logspace(-3,3,6)\n",
    "\n",
    "accuracy_s2 = []\n",
    "for i, oneC in enumerate(C_s2):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_test, y_test)\n",
    "        accuracy_s2.append(tmp)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzsnXd4VFX6xz8nPaRDIEBCCIFQQhICBEJVqqBSXEURyyIKWLDLumBbxfJTEDsiuCBt1RVBYV1QwVUQBQVBpKkQWkgCaYTUSaa8vz8mGRJaJiGTSTmf55kn9557ynvvZOad95TvUSKCRqPRaDSXwsXZBmg0Go2m7qOdhUaj0WgqRTsLjUaj0VSKdhYajUajqRTtLDQajUZTKdpZaDQajaZStLPQaDQaTaVoZ6HRaDSaStHOQqPRaDSV4uZsA2qK4OBgiYiIcLYZGo1GU6/45ZdfMkWkeWX5GoyziIiIYMeOHc42Q6PRaOoVSqlj9uTT3VAajUajqRTtLDQajUZTKdpZaDQajaZSGsyYxYUwGo2cOHECg8HgbFM0Gs1l4uXlRVhYGO7u7s42pVHSoJ3FiRMn8PPzIyIiAqWUs83RaDTVRETIysrixIkTtGvXztnmNEoc1g2llFqslEpXSu29yHWllHpLKXVIKfWbUqpHuWsTlVIHS18Tq2uDwWCgWbNm2lFoNPUcpRTNmjXTvQROxJFjFkuAkZe4fjUQVfqaCswHUEo1Bf4BJAK9gX8opYKqa4R2FBpNw0B/lp2Lw7qhRGSzUiriElnGAsvEuq/rNqVUoFKqFTAI2CAi2QBKqQ1Ync5HjrJVo2mIlBQUkpeZ7WwzapSCrNP8696ZzjajTmARCyaLEaPFhLuvF5PemO3Q9pw5ZhEKJJc7P1GadrH081BKTcUalRAeHu4YK2uIxMREiouLyc7OpqioiNBQ6y19/vnnVGXl+erVq4mOjqZz585Van/AgAG88847xMfHV6lcGa+++iqtW7fmlltuqVb52uDGG2/klVdeITIy8rxrW7du5Z577kEphYgwa9Ysxo4de16+pKQkJkyYQHZ2Nr1792bp0qX1dkA1NyMLk7lhdduYLUZOZu9xthl1Dtf8pg5vo14PcIvIQmAhQEJCgjjZnEvy008/AbBkyRJ27NjBO++8U616Vq9ejYuLS5WdxeVgNBpZtmwZu3btqrU2q8M999zDnDlzmD9//nnXunXrxi+//IKbmxupqal0796d0aNH4+JSsSf2b3/7G48//jjjxo1j8uTJLFmyhClTptTWLdQYIoLJXIKL8qBFZFtnm1NjnC4x8di/v3C2GQ5BREgtSOXg6YMcPH2QP0//ycHTBzmaexSzmAFwd3GnfWB7OgZ1JCowiqigKDoGdSTYO9jh9jnTWaQAbcqdh5WmpWDtiiqf/l2tWeUE1q9fz6xZsyguLiYqKorFixfj4+PD3/72N/773//i5ubG1VdfzahRo1i3bh0//PADzz77bJWjkjJWrFjBK6+8gogwZswYXnrpJQAWLFjA3LlzCQoKIjY2Fl9fX9544w02bNhA7969cXV1BWDbtm1MnToVFxcXhg0bxsaNG/n1119JSkrijjvuID8/HxcXF959910SExPZuHEjL774In5+fuzdu5dbbrmFjh078vbbb1NcXMzatWuJiIjgtttuIyAggB07dpCZmckHH3zAokWL+Omnn+jfvz+LFi0CYOrUqezcuZOioiLGjx/PM888A8CgQYOYPHkyZrPZZmsZTZo0sR0XFRUB1g9necxmM5s3b2blypUATJw4kZdffrleOoui07mABQ9PT2eborkAuSW55zmFQzmHyDfm2/KE+oYSFRjFkPAhdAzqSMegjoT7h+Pm4pyvbWc6i7XA/Uqpj7EOZp8RkTSl1FfAS+UGta8CLruT8rn/7GN/au7lVlOB6Nb+/GN018uqIz09nZdffplvvvmGJk2a8OKLL/Lmm29y1113sW7dOvbt24dSipycHAIDA7nmmmsYN24c1113XbXaO3HiBE899RQ7duwgICCAYcOG8cUXX9CtWzdefvlldu7ciY+PD4MGDaJ3794A/PDDD/Ts2dNWx6RJk1i6dCm9e/dm+vTptvRWrVqxYcMGvLy8+P3335k4caItotq9ezcHDhwgICCAiIgI7rvvPrZv387cuXN55513ePXVVwE4c+YMP/30E6tWrWL06NFs3bqVzp0706NHD/bu3UtMTAwvv/wyTZs2xWQyMXjwYMaNG0d0dDSurq5ERESwd+9eunXrdt69//jjj0yZMoVjx47x4YcfnudQMjIyCA4OtqWHhYWRkpJSrefsbIry8gDwaVrtuSGaGsBoNnIk90gFp3Aw5yAnC07a8vh5+BEVGMWo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b+HChTJp0iSxWCwiInLq1CkREVmzZo2MGjVKRES+//576devn4iIZGRkSLt27eT06dOSmZkpERERkpOTIyIiPXr0kJ9//lksFosMHz5cvv76axEReeSRR2TOnDkiIvL888/LE088UaU22rZtK3/s+kWyjqc4rA177+PFl1+UpNNJ8sCMB+S+x+6TQmNhtdr48ccfJTk5WQICAi75HtfFz3R9B9gh9nyf25OpPrzqs7NYt26d9OnTR7p37y433XST5Ofni4jI9OnTpUuXLhIbGyuPP/64bN68WYKCgiQiIkK6desmR44csbvd8s5i+fLlEhMTI127dpWZM2fa8rz33nsSFRUlvXv3lrvuukseeughERH573//K3fddZct39atWyU2Nla6desmjz32mHTr1k1ERA4dOiQDBgyQ+Ph46dGjh2zbtk1ERDZs2CCDBg2S0aNHS7t27eTJJ5+UpUuXSkJCgsTGxtru49Zbb5X77rtPevfuLZGRkbJp0yb561//Kp06dZI777zT1v6UKVOkZ8+eEh0dLc8995wt3WQySURExAWd2qxZs2T27Nm28yFDhsjPP/98Xr7u3btf8Lneeeed8sknn9jOIyMjJT09XZYtWyb33XffefmOHz8u0dHRtvTy+crKikiFfPa2cev4m2XhW2/Kwf0HHNZGZfdhNBulbbu2svnAZvk963fZ8+eeardRhtFo1M7CCdjrLJw9wF1rvPLzK/yeXfXum0vRuWln/t7775dVh5Yorx2J8pSUFAYNGmQ7DwsLIyUlhV69elXId+TIEVasWMHnn39OixYtePvtt2nfvj0pKSm0adPmvPJVTQdr902ZJEloaChpaWk2G+2pK6RFC06mZ5B5JsdhbVwsvXVoa44cP8LB0wfJzsomqk0Uzb2bowJVtdvQ1A/0HDYnoyXK65ZEucFgwNfXlx07dnDHHXcwefLkatflCEyGYhAzLqr2RfYKSgpIK0ij2FxME/cmuCgXLfjXiGg0kcXlRgCOQrREea1IlIeGhpKcfHbZz4kTJwgNPXfZj/VX+A033ADADTfcwN13321LT05Opk+fPhXKh4aGsm3btgr1xsTEXLK9Zs2akZGRQfPmzUlJSaFVq1Z2t1GQlUPayVN0757gsDbOvY/jycdJzksmtziX1JRUIsMjCfcLr7E2NPUDHVk4GS1RXjWqK1E+ZswYPvroI0pKSkhKSuLYsWMVutbKuO666/j2228B+Pbbb217nY8ZM4Zly5YBsGXLFkJCQmjevDkjR45k/fr15OTkkJWVxTfffMNVV11FmzZt8PT0ZPv27YgIy5cvZ+zYsba6li5dCsDSpUsrpFfWRtrJNL7fupVRfxnrsDbK7mPY8GF4NfMCV/hx248EewezYfUGbrz+RpRSNdLGVVdddXn/EJraw56Bjfrwqs8D3F9//bUkJCRIXFycxMXFyRdffCHJycnSq1cviYuLk5iYGFm2bJmIiGzatEk6d+5cYwPcM2bMsOV59913pUOHDtK7d2+5/fbb5ZlnnhERkaSkJBk0aJAt3w8//CAxMTESHx8vDzzwgFxxxRUiIvL7779LTEyMxMXFycyZM8XHx0dErAPcY8eOvaAt5a+Vn+l18OBB28B5+WsWi0Vuu+02iYqKkmHDhsnYsWNl+fLlIiKSkpIiffr0uegzeO655yQyMlI6duwoX331lS39qquuss16ysrKkpEjR0pMTIz07dtXfvvtNxERMZvNcvfdd0tkZKTExMTIzp07beUXLlwo7du3l/bt28vSpUtt6du2bZPo6GiJjIyUBx980Jaenp4ugwYNkg4dOsjw4cMlOzvb7jYiwsPl7Vdfc2gb7du3l/cWvSd/ZP8hezP2yppv1kiX6C413kb5Z/XII49IaGioKKUkNDRUnn/++Qu+h3XxM13fwc4Bbi1RrrGhJcrrNjbhQN8g/EKCHdJGsamYk4UnyS/Jx9PVk5Y+Lasl+Oco9Ge65qkLQoKaesbTTz/Nd999h8FgYOTIkReUKI+MjGTt2rXMnj0bk8lEREQES5YscZ7R5WjoEuWGwlLhwGY1v3BNC/5pKkNHFhpNPUAsFk4dOYKLcqNFZNuaq1eE3JJcThacxGQxEegZSAufFri7uNdYGzWJ/kzXPDqy0GgaEEWnc6lp4UCDyUBaQRqFxkIt+KepFO0sNJp6QFF+zQkHmiwmMgoztOCfpkpoZ6HR1APKhAPdvaofWYgIp4tPk16YjtlipqlXU5o3aY6bi/4a0FSO/i/RaOo4xXkFiJjx8PCqdh2FxkLSCtIwmAw0cW9CK/9WeLlVvz5N40NPdagltES54zlXovxi0trl2bhxIwEBAbb348UXX7Rde+211+jatStdu3bl7bfftqXv2rWLPn36EBsby9ixY8kv7SIqLi5m4sSJxMbGEh8fz+bNm21lPvzwQ2JjY+natSszZ860pR89epQhQ4YQFxfH4MGDK0iVTJ8+nZiYGOITevLF+i/xCQyw2dyjRw9iYmK48847bSvgs7OzGTNmDHFxcSQmJrJ//36MFiMpeSk8+/KzjOwzknFXjOM/S/9jcxS1fS8xMTF8+umntnSRC0vCa+og9izGqA+v+rworypoifKLc65E+cWktctz7oLBMnbt2iVxcXFSWFgoJSUlMmjQIDl8+LCIiMTHx8uWLVtERGTBggXy7LPPiojIG2+8IZMnTxYRkbS0NOnZs6dYLBY5deqUhIeHS2ZmplgsFrnlllvku+++ExGR6667TlasWCEiIl999ZXccccdIiLy+eefy4gRI8RkMknSb3slrmtXycvLE5PJJKGhoXLo0CEREZk5c6YsWbJEREQefvhheeGFF0REZO/evTJoyCDZn7lfPv32U4mOiZa8/Dyn30teXp706NFD8vLyROTikvAXoy5+pus72LkoT0cWdYD169fTt29fevTowfjx4ykoKADgb3/7G9HR0cTFxfH3v/+d77//nnXr1vHII49UKyopY8WKFcTGxhITE8MTTzxhS1+wYAEdO3YkMTGRyZMn8/DDDwOwYcMGevfujaurVTBu27ZtxMXFER8fz/Tp04mPjwcgKSmJgQMH0r17d3r27GlTnN24cSODBw9mzJgxREZG8tRTT7Fs2TJ69epFXFyc7T5uu+02pk2bRmJiIu3bt2fz5s1MnDiRzp07c9ddd9nsnDp1KgkJCXTt2pVZs2bZ0gcNGsSXX36J2WwmOTkZg8FAr169UEpx++238/nnn9v9jA4cOECfPn3w9vbG3d2dK664gs8++8x2n/379wdg+PDhrFq1CoD9+/czZMgQAFq2bImPjw+7du0iKSmJzp0706xZM5RSDBs27IJlhg4dapNZ2b9/P1deeSViNNGkiQddOnXh66+/Jj09HR8fH9q3b3/R9kWEkMgQ/vjzD4pyiyg4UcCAfgPw9fF16r24urri6+tLTEyMTeds/vz5PPPMM7bB9RYtWtj9Hmlql0YzZnHypZcoPlCzEuWeXTrTstyXbXXQEuWOkSgvKiqyWw57y5YtdOvWjdDQUF599VWio6OJjY3lueeeIzs7G09PT9avX2/7Uu3cuTNffPEFo0aNYuXKlTYxv27durFmzRpuuukmjh49yq5du0hOTqZ///7s27eP48eP06pVK9asWWP7cuzWrRurV69m2rRprFq1itzcXM6cOWN7PybdeDOZ2dls3f4Tfa8YwHXXXUdRURG7du0iPj6eVatWVWh/1apVRMRG8L/v/8ep1FOoM4oe8T146YWXnH4vDz/8MPn5+WzatIkePXoAF5eE19Q9dGThZLREuXMlynv16sXRo0fZvXs39957L9dffz0AMTExPProowwbNoyrr76a7t272yKrJUuW8Oabb9KzZ08MBgPu7tYFbFOmTCEkJISePXsyffp0+vXrh6urK8F2P9unAAAgAElEQVTBwcybN49x48Zx5ZVXEhkZaavr9ddft41BbN26lZYtW+Lq6so111zDsGHDGDbmWqY9+pitLhcXFz788EMeeOABEhMTCQgIsNU184mZHE09yuA+g1mzYg3dunXD3c29ztxL3759ufXWW+nbt6+tTF2XhNecpdFEFpcbATgKES1R7giJcnslyQMCAmzHo0eP5t5777VFcVOnTmXq1KkAPP7443To0AGA6OhoNmzYAFi7WL788ksA3N3defPNN2319e7dm44dOwIwduxYmyrru+++i5eXdYA5NDTU1iWUm5vLqlWrbM/tqSeeZOqtt+Dq4sG0v0+31TVgwAC2bNkCwLp16zhy5Agmi4kclcNzbz1HS5+WBHkGERERQbt27QCcfi/PPPOM7X/ypptustV1MUl4Td1DRxZORkuUVw17JcovJd9dnpMnT9qOt23bhpubG4GBVu2l9PR0wDrLZ+3atdx8880V0i0WCy+88AL33HMPYH3vCgsLAes4lK+vr+1LsaxMdnY27733nu0XdGZmpu05vfTSS7Z0k8lE8qHDgPBH0iEOHDjA0KFDK9RlMBiYPXs2d025iyNnjnAq6xQhXiE0827GggULGDZsmC0idfa9ZGdnA9bZV+Xv5WKS8Jq6h0MjC6XUSOBNwBX4p4i8fM71tsBioDmQDdwmIidKr00EnirN+oKILHWkrc4iJCSERYsWMX78eEpKSgDrB83b25vrr7+e4uJiLBYLr732GgATJkzg7rvvZu7cuXz++edERERUqb2wsDCef/55Bg0ahIgwevRorr32WsA6oN6rVy+aNm1Kp06dbL+6r7nmmgoDzIsXL2bSpEm4ubkxcOBAW77777+fcePGsXjx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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s3 =np.array(accuracy_s2).reshape(len(C_s2),len(gamma_s))\n",
    "x_axis = np.log10(C_s2)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s3[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_HW.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7rc1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
